package org.nnxy.foodboot.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nnxy.foodboot.entity.UserRecipeInteraction;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户食谱交互服务接口
 */
public interface UserRecipeInteractionService extends IService<UserRecipeInteraction> {
    
    /**
     * 根据用户ID和食谱ID获取交互记录
     * @param userId 用户ID
     * @param recipeId 食谱ID
     * @return 交互记录
     */
    UserRecipeInteraction getInteractionByUserIdAndRecipeId(Integer userId, Integer recipeId);
    
    /**
     * 分页获取用户交互记录
     * @param page 分页参数
     * @param userId 用户ID
     * @return 分页结果
     */
    Page<UserRecipeInteraction> getUserInteractionsPage(Page<UserRecipeInteraction> page, Integer userId);
    
    /**
     * 更新用户浏览食谱记录
     * @param userId 用户ID
     * @param recipeId 食谱ID
     * @return 是否成功
     */
    boolean updateBrowseRecord(Integer userId, Integer recipeId);
    
    /**
     * 更新用户收藏食谱记录
     * @param userId 用户ID
     * @param recipeId 食谱ID
     * @param isFavorite 是否收藏
     * @return 是否成功
     */
    boolean updateFavoriteRecord(Integer userId, Integer recipeId, Boolean isFavorite);
    
    /**
     * 更新用户对食谱的评分
     * @param userId 用户ID
     * @param recipeId 食谱ID
     * @param rating 评分
     * @param review 评价内容
     * @return 是否成功
     */
    boolean updateRatingRecord(Integer userId, Integer recipeId, BigDecimal rating, String review);
    
    /**
     * 更新用户制作食谱记录
     * @param userId 用户ID
     * @param recipeId 食谱ID
     * @param satisfactionLevel 满意度
     * @return 是否成功
     */
    boolean updateMakeRecord(Integer userId, Integer recipeId, String satisfactionLevel);
    
    /**
     * 获取用户最常浏览的食谱ID列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 食谱ID列表
     */
    List<Integer> getMostViewedRecipeIds(Integer userId, Integer limit);
    
    /**
     * 获取用户收藏的食谱ID列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 食谱ID列表
     */
    List<Integer> getFavoriteRecipeIds(Integer userId, Integer limit);
    
    /**
     * 获取用户高评分的食谱ID列表
     * @param userId 用户ID
     * @param minRating 最低评分
     * @param limit 限制数量
     * @return 食谱ID列表
     */
    List<Integer> getHighRatedRecipeIds(Integer userId, Double minRating, Integer limit);
    
    /**
     * 获取用户交互统计信息
     * @param userId 用户ID
     * @return 统计信息
     */
    Map<String, Object> getUserInteractionStats(Integer userId);
    
    /**
     * 获取用户最喜欢的食谱分类
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 分类列表
     */
    List<Map<String, Object>> getUserFavoriteCategories(Integer userId, int limit);
    
    /**
     * 获取用户评分分布
     * @param userId 用户ID
     * @return 评分分布
     */
    Map<String, Long> getUserRatingDistribution(Integer userId);
    
    /**
     * 获取用户按天的活跃度统计
     * @param userId 用户ID
     * @param days 天数
     * @return 活跃度统计
     */
    Map<String, Long> getUserActivityByDay(Integer userId, int days);
    
    /**
     * 获取用户最近的交互记录
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 交互记录
     */
    List<Map<String, Object>> getRecentInteractions(Integer userId, int limit);
    
    /**
     * 获取总浏览量
     * @return 总浏览量
     */
    long getTotalBrowseCount();
    
    /**
     * 获取指定时间范围内的浏览数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 浏览数量
     */
    long countBrowseByTimeRange(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取浏览量最高的食谱列表
     * @param limit 限制数量
     * @return 食谱列表
     */
    List<Map<String, Object>> getMostViewedRecipes(Integer limit);
    
    /**
     * 获取评分最高的食谱列表
     * @param limit 限制数量
     * @return 食谱列表
     */
    List<Map<String, Object>> getHighestRatedRecipes(Integer limit);
} 